 
import UIKit

extension Optional {
    /// 可选值为空的时候返回 true
    var isNone: Bool {
        switch self {
        case .none:
            return true
        case .some:
            return false
        }
    }
    
    /// 可选值非空返回 true
    var isSome: Bool {
        return !isNone
    }
    
//    // 2. 减少使用 ternary operator
//    let letter = someBoolean ? "a" : "b"
//    复制代码三目运算符写法更加简洁，但会增加编译时间，如果想要减少编译时间，可以改写为下面的写法。
//    var letter = ""
//    if someBoolean {
//      letter = "a"
//    } else {
//      letter = "b"
//    }
//   减少使用 nil coalescing operator
//    let string = optionalString.unwrap
//
// 优雅解包
    var unwrap:String {
        guard let valueX = self else {
            return ""
        }
        return "\(valueX)"
    }
    // 代替 ?? 这个方法编译效率更高
    func standby(_ new:String) -> String {
        guard let valueX = self else {
            return new
        }
        return "\(valueX)"
    }
   
 }
 
extension Optional where Wrapped : ExpressibleByIntegerLiteral {
    var doubleWrap:Double {
        if self is Optional<Double> {
            return self.isSome ? (self! as! Double) : 0.0
        } else {
            fatalError("error")
        }
    }

    var intWrap:Int {
           if self is Optional<Int> {
               return self.isSome ? (self! as! Int) : 0
           } else {
               fatalError("error")
           }
       }
    
}
extension Optional where Wrapped : ExpressibleByFloatLiteral {
    var floatWrap:Float {
        if self is Optional<Float> {
            return self.isSome ? (self! as! Float) : 0.0
        } else {
            fatalError("error")
        }
    }
}
 
